iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
生成式 AI

RAG自己來系列:客服機器人系列 第 8

[Day 8] 用 Qdrant 搜尋相似資料

  • 分享至 

  • xImage
  •  

Qdrant

Qdrant 是一個向量相似性搜索引擎,它提供了一個生產就緒的服務,具有方便的 API,用於儲存、搜索和管理點(即向量)以及附加的有效載荷。有效載荷可以看作是附加訊息,幫助你精確搜索並提供給用戶有用的訊息。

Server 端官方提供原端以及 Docker 容器兩種啟用方法,雲端免費版本提供1 GB RAM, 0.5 CPU 與 4 GB Disk

那麼我們使用 Docker 的方法部屬我們的向量資量庫,執行以下指令,即可部屬自己的服務

docker run -p 6333:6333 -p 6334:6334 \
    -v $(pwd)/qdrant_storage:/qdrant/storage:z \
    qdrant/qdrant

-v 掛卷會指定當前目錄的 qdrant_storage 資料夾,進行資料的存儲。

待容器起起來後,根據官方的操作手冊,安裝pip套件以及等等會用到的模型

pip install qdrant-client sentence-transformers

透過以下程式碼確認容器與 collection 是否有被起起來~~

from qdrant_client import QdrantClient

client = QdrantClient("http://localhost:6333")
client.create_collection(
    collection_name="Health_Tips",
    vectors_config=VectorParams(size=384, distance=Distance.COSINE),
)

這時打開瀏覽器,並且輸入網址http://127.0.0.1:6333/dashboard

確認 collection 有被正確建立
image

在這邊可以特別注意vector_config裡面參數,取決於你使用的詞嵌入模型而vector_configsize 就要根據模型的維度去做更動,例如 OpenAI 提供的 text-embedding-ada-002 為 1536,這個維度就想像成一句話會被切分成多少等分的向量,而理論上維度越高,對相似搜尋也越有利。

而後方的 distance 則通常是使用餘弦相似度,算是在計算「文本相似度」的任務中比其他演算法還要來的穩定。

而文本的部份,這次就用一點不一樣的吧,我們來點健康方面的小提示。


from qdrant_client.models import *
text = [
    "保持適當的體重,減少肥胖相關的健康問題,如糖尿病和高血壓。"
    "學會管理壓力,通過冥想、深呼吸和運動等方法來放鬆身心。",
    "正確服用藥物,遵從醫生指示,不自行增加或減少劑量。",
    "定期進行牙齒檢查和清潔,每天刷牙和使用牙線以保持口腔健康。",
    "及早發現和治療心理健康問題,如焦慮和抑鬱,尋求專業幫助。",
    "保護皮膚,避免長時間暴露在陽光下,使用防曬霜來減少皮膚癌的風險。",
    "正確的姿勢和適當的椅子高度有助於減少頸部和背部疼痛。",
    "定期進行視力檢查,特別是使用電腦和手機時間長的人群。",
    "確保家庭急救箱內備有基本藥品和急救用品,隨時應對緊急情況。",
    "遵守交通規則,佩戴安全帶和頭盔,以減少交通事故的發生。",
    "孕婦應定期產檢,保持健康飲食,避免吸菸和飲酒,確保胎兒健康發育。"
]
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
embeded_text = model.encode(text)
client.upsert(
    collection_name="Health_Tips",
    points=[
        PointStruct(id=i, vector=vector.tolist(), payload={"document": text})
        for i, (vector, text) in enumerate(zip(embeded_text, text))
    ]
)

確認資料上傳完成後,進行相似搜尋的部份。

search_text = "能不能給我一些運動的建議?"

search_results = client.search(
    collection_name="Health_Tips",
    query_vector=model.encode([search_text])[0],
    limit=1
)
print(search_results[0].payload["document"])

"""
適量運動,每週進行至少 150 分鐘的中等強度運動,如快走或騎自行車。
"""

Qdrant 與前兩天介紹的 Faiss 與 Milvus,它結合了 faiss 的速度以及 Milvus 的向量儲存功能,並且本地端也可以透過前端界面以及 API 去操控我們的向量資料,在程式開發上 Qdrant 會對開發者更有好。雖然在拓展性方面輸 Milvus

參考資料


上一篇
[Day 7] 用 Milvus 搜尋相似資料
下一篇
[Day 9] [複習篇] Day2 ~ Day8 周回複習
系列文
RAG自己來系列:客服機器人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言